# 1. websocket (可以是非同域名的多个 tab)
利用 websocket 全双工通信的特性,A tab 页向服务端发送信息,再由服务端向 B tab 页发送信息,即可实现 A 向 B 的通信。
# 2. localStorage (同域名的多个 tab)
localStorage 是浏览器多个标签共用的存储空间,所以可以用来实现多标签之间的通信(ps:sessionStorage 是会话级的存储空间,每个标签页都是单独的)。
直接在window对象上添加监听即可:
window.onstorage = (e) => {console.log(e)} // 或者这样 window.addEventListener('storage', (e) => console.log(e))
onstorage 以及 storage 事件,针对的都是非当前页面对 localStorage 进行修改时才会触发,当前页面修改 localStorage 不会触发监听函数。仅在对已有的数据的值进行修改时才会触发,比如原本已经有一个key为a值为b的 localStorage,你再执行:localStorage.setItem('a', 'b')代码,同样是不会触发监听函数的。
# 3. SharedWorker (同域名的多个 tab)
SharedWorker 是一个共享进程中的一个线程,可以被多个tab共同使用,但必须保证这些标签页都是同源的(相同的协议,主机和端口号)。(WebWorker是渲染进程内部的单独线程,不可多个tab共享)
SharedWorker 的消息传递
// tab 页中 // 1. 创建 shaerdWorker 对象 let worker = new SharedWorker('sharedworkers.js'); // 传递 start 指令 worker.port.postMessage('start'); // 接收子线程的数据 worker.port.onmessage = function (val) { timeDom.innerHTML = val.data }
// sharedworkers.js onconnect = function (e) { // 通过 e.ports 拿到 port var port = e.ports[0];
// port.onmessage 监听父线程的消息 port.onmessage = function () { // port.postMessage 向父线程传递消息 port.postMessage(a++) }
}